package com.example.ccj.b.c.dialog;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.example.ccj.R;
import com.example.ccj.u.ImageUtils;
import com.example.ccj.u.LogUtils;
import com.example.ccj.u.media.IPictureSelectResultListener;
import com.example.ccj.u.media.MediaUtils;
import com.luck.picture.lib.entity.LocalMedia;

import java.util.ArrayList;

import cn.bingoogolapple.qrcode.core.BarcodeType;
import cn.bingoogolapple.qrcode.core.QRCodeView;
import cn.bingoogolapple.qrcode.zxing.ZXingView;

public class QRCodeDialog extends DialogBase implements QRCodeView.Delegate {
    public QRCodeDialog(@NonNull Context context,ScanResult scanResult) {
        super(context);
        this.scanResult = scanResult;
    }

    ScanResult scanResult;
    private ZXingView mZXingView;
    TextView resultText;

    private boolean flashIsOpen = false;
    private boolean barCodeIsOpen = false;
    private boolean qrCodeIsOpen = false;

    @Override
    public void onInit() {
        isCanClose(true);
        setLayout(R.layout.dialog_qr_code);
        setAlpha(1f);//透明度
        isCanClose(true);//点击允许关闭
        isShowBackground(true);//不显示背景
        showInBottom();//底部弹出
        setFull(true);

        mZXingView = findViewById(R.id.zxing_scan_code_view);
        mZXingView.setDelegate(this);
        ImageView flash = findViewById(R.id.flash);
        ImageView selectImg = findViewById(R.id.select_img);
        ImageView qrCodeImg = findViewById(R.id.qr_code_img);
        ImageView barCodeImg = findViewById(R.id.bar_code_img);

        LinearLayout barCode = findViewById(R.id.bar_code);
        LinearLayout qrCode = findViewById(R.id.qr_code);
        resultText = findViewById(R.id.result_text);


        //选择图片扫描
        selectImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaUtils mediaUtils = new MediaUtils();
                mediaUtils.pickAPictureOrCamera(v.getContext(), new ArrayList<>(), new IPictureSelectResultListener() {
                    @Override
                    public void onResult(ArrayList<LocalMedia> result) {
                        if (result != null) mZXingView.decodeQRCode(result.get(0).getRealPath());
                    }
                });
            }
        });

        //打开关闭闪光灯
        flash.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (flashIsOpen) {
                    flash.setImageResource(R.mipmap.flash_grey);
                    flashIsOpen = false;
                    mZXingView.closeFlashlight(); // 关闭闪光灯
                } else {
                    flash.setImageResource(R.mipmap.flash);
                    flashIsOpen = true;
                    mZXingView.openFlashlight(); // 打开闪光灯
                }
            }
        });

        // 切换成扫描条码样式
        barCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (barCodeIsOpen) {
                    barCodeImg.setImageResource(R.mipmap.bar_code_grey);
                    barCodeIsOpen = false;
                    mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
                    mZXingView.setType(BarcodeType.ALL, null); // 识别所有类型的码
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                } else {
                    if (qrCodeIsOpen) {
                        qrCodeImg.setImageResource(R.mipmap.qr_code_grey);
                        qrCodeIsOpen = false;
                    }
                    barCodeImg.setImageResource(R.mipmap.bar_code);
                    barCodeIsOpen = true;
                    mZXingView.changeToScanBarcodeStyle(); // 切换成扫描条码样式
                    mZXingView.setType(BarcodeType.ONE_DIMENSION, null); // 只识别一维条码
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                }
            }
        });

        // 切换成扫描二维码样式
        qrCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (qrCodeIsOpen) {
                    qrCodeImg.setImageResource(R.mipmap.qr_code_grey);
                    qrCodeIsOpen = false;
                    mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
                    mZXingView.setType(BarcodeType.ALL, null); // 识别所有类型的码
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                } else {
                    if (barCodeIsOpen) {
                        barCodeImg.setImageResource(R.mipmap.bar_code_grey);
                        barCodeIsOpen = false;
                    }
                    qrCodeImg.setImageResource(R.mipmap.qr_code);
                    qrCodeIsOpen = true;
                    mZXingView.changeToScanQRCodeStyle(); // 切换成扫描二维码样式
                    mZXingView.setType(BarcodeType.HIGH_FREQUENCY, null); // 只识别高频率格式，包括 QR_CODE、UPC_A、EAN_13、CODE_128
                    mZXingView.startSpotAndShowRect(); // 显示扫描框，并开始识别
                }
            }
        });
    }


    /**
     * 扫描结果
     * @param result 摄像头扫码时只要回调了该方法 result 就一定有值，不会为 null。解析本地图片或 Bitmap 时 result 可能为 null
     */
    @Override
    public void onScanQRCodeSuccess(String result) {
        setTitle("扫描结果为：" + result);
        if (result != null) {
            resultText.setText(result);
            vibrate();//扫描到震动
            mZXingView.stopSpot();//停止扫描
            LogUtils.d( "onScanQRCodeSuccess() 扫描到的字符串: " + result);
            scanResult.onResult(result);
        } else {
            mZXingView.startSpot(); // 开始识别
        }
    }

    //震动
    private void vibrate() {
        Vibrator vibrator = (Vibrator) getContext().getSystemService(getContext().VIBRATOR_SERVICE);
        vibrator.vibrate(100);
    }

    /**
     *
     * @param isDark 是否变暗
     */
    @Override
    public void onCameraAmbientBrightnessChanged(boolean isDark) {
        // 这里是通过修改提示文案来展示环境是否过暗的状态，接入方也可以根据 isDark 的值来实现其他交互效果
        String tipText = mZXingView.getScanBoxView().getTipText();
        String ambientBrightnessTip = "\n环境过暗，请打开闪光灯";
        if (isDark) {
            if (!tipText.contains(ambientBrightnessTip)) {
                mZXingView.getScanBoxView().setTipText(tipText + ambientBrightnessTip);
            }
        } else {
            if (tipText.contains(ambientBrightnessTip)) {
                tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip));
                mZXingView.getScanBoxView().setTipText(tipText);
            }
        }
    }

    @Override
    public void onScanQRCodeOpenCameraError() {
        LogUtils.e( "onScanQRCodeOpenCameraError() 扫码: " + "打开相机出错");
    }

    public interface ScanResult{
        void onResult(String value);
    }


}
